﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Data;

namespace SBS
{
    public class OrdreBog
    {
        private Dictionary<int, Ordre> ordrer;
        private Ordre aktivOrdre;

       

        public OrdreBog()
        {
            aktivOrdre = new Ordre();
        }

        public Dictionary<int, Ordre> Ordrer
        {
            get
            {
                return ordrer;
            }
            set
            {
                value = ordrer;
            }
        }
    

        public Ordre AktivOrdre
        {
            get
            {
                return aktivOrdre;
            }
            
        }

        public List<KeyValuePair<string, string>> HentUdlejningsStatus(DateTime UdlejningsDato)
        {
            return Data.Ordre_DB.HentUdlejningsStatus(UdlejningsDato);
        }

        public bool GemOrdre(Kunde AktivKunde, bool KontantSalg)
        {
            aktivOrdre.AktuelKunde = AktivKunde;
            return Data.Ordre_DB.GemOrdre(this.aktivOrdre, KontantSalg);
        }

        public Dictionary<int, Ordre> HentArbejdsOversigt(int MekNr)
        {
            return Data.Ordre_DB.HentArbejdsOversigt(MekNr);
        }

        public bool RegistrerArbejde(Ordre o)
        {
            return Data.Ordre_DB.RegistrerArbejde(o);
        }
        public void HentFaktura()
        {
            ordrer = Data.Ordre_DB.HentFaktura();

        }
        public void GemUfaktureretFaktura()
        {
            string mappenavn = Printer.OpretAktuelMappe();

            foreach (KeyValuePair<int, Ordre> o in ordrer)
            {
                if (o.Value.Faktureret == false)
                {
                    Printer.LavFaktura(mappenavn, o.Value);
                    
                }
            }
            Printer.SamleOgUdskrivFaktura(mappenavn);
            Data.Ordre_DB.OpdaterFaktureringsStatus(ordrer);
        }
        public void GemUbetalteFaktura()
        {
            string mappenavn = Printer.OpretAktuelMappe();

            foreach (KeyValuePair<int, Ordre> o in ordrer)
            {
                if (o.Value.Faktureret == true && o.Value.Betalt == false)
                    Printer.LavFaktura(mappenavn, o.Value);
            }
            Printer.SamleOgUdskrivFaktura(mappenavn);
        }
        public void VisFaktura(int Onr)
        {
            aktivOrdre = ordrer[Onr];

            Printer.VisFaktura(aktivOrdre);
        }

        public bool OpdaterBetalingsStatus(int Onr)
        {
            return Data.Ordre_DB.OpdaterBetalingsStatus(Onr);
        }

        public void Udlejning()
        {
            this.aktivOrdre = new Ordre();
        }

       
    }

    public class Ordre
    {
        private DateTime oprettelseDato;
        private DateTime udforsDato;
        private bool udfort;
       // private double moms;
        private int onr;
        private string regnr;
        private Udlejning udlejning;
        private List<OrdreLinie> ordrelinier;
        private Kunde aktuelKunde;
        //Kunne det nøjes med en string AktuelRegnr ?
        private Scooter kundesScooter;
        private bool betalt;
        private bool faktureret;
        private DateTime faktureringsdato;
        private Mekaniker udfoerendeMekaniker;

        /// <summary>
        /// Constructor til Ordrer
        /// </summary>
        public Ordre()
        {
            ordrelinier = new List<OrdreLinie>();
            
        }

        public bool Faktureret
        {
            get { return faktureret; }
        }

        public Ordre(int Onr, DateTime OprettelseDato, DateTime UdforsDato, Kunde AktuelKunde, Scooter KundesScooter)
        {
            this.onr = Onr;
            this.oprettelseDato = OprettelseDato;
            this.udforsDato = UdforsDato;
            this.aktuelKunde = AktuelKunde;
            this.kundesScooter = KundesScooter;
            ordrelinier = new List<OrdreLinie>();

        }
        public Ordre(int Onr, DateTime OprettelseDato, DateTime UdforsDato, string Regnr, bool Faktureret, bool Betalt, Kunde AktuelKunde)
        {
            this.onr = Onr;
            this.oprettelseDato = OprettelseDato;
            this.udforsDato = UdforsDato;
            this.regnr = Regnr;
            this.faktureret = Faktureret;
            this.betalt = Betalt;
            this.aktuelKunde = AktuelKunde;
            ordrelinier = new List<OrdreLinie>();
        }

        public bool Betalt
        {
            get { return betalt; }
            set { betalt = value; }
        }

        public DateTime OprettelseDato
        {
            get
            {
                return oprettelseDato;
            }
            set
            {
               
            }
        }

        public int Onr
        {
            get { return onr; }
        }

        

        public Scooter KundesScooter
        {
            get { return kundesScooter; }
            set { value = kundesScooter; }
        }

        public Mekaniker UdfoerendeMekaniker
        {
            get { return udfoerendeMekaniker; }
            set { udfoerendeMekaniker = value; }
        }
        public Kunde AktuelKunde
        {
            get { return aktuelKunde; }
            set { aktuelKunde = value; }
        }

        public DateTime UdforsDato
        {
            get
            {
                return udforsDato;
            }
            set
            {
                udforsDato = value;
            }
        }

        public bool Udfort
        {
            get
            {
                return udfort;
            }
            set
            {
                udfort = value;
            }
        }

        public double Moms
        {
            get
            {
                throw new System.NotImplementedException();
            }
            set
            {
            }
        }

        public Udlejning Udlejning
        {
            get
            {
                return udlejning;
            }
            set
            {
                udlejning = value;
            }
        }

        public List<OrdreLinie> OrdreLinier
        {
            get
            {
                return ordrelinier;
            }
            set
            {
                value = ordrelinier;
            }
        }

        public double TilfoejOrdreLinie(OrdreLinie ol)
        {
            ordrelinier.Add(ol);
            return HentOrdrensTotalPris();
        }

        public double HentOrdrensTotalPris()
        {
            double sum = 0;
            foreach (OrdreLinie o in ordrelinier)
            {
                sum += o.Antal * o.SolgtTilPris;
            }
            return sum;
        }

        public void SetKundesScooter(Scooter s)
        {
            kundesScooter = s;
        }

        public void TilfoejMekanikerTilOrdre(int MekNr)
        {
            udfoerendeMekaniker = new Mekaniker();
            udfoerendeMekaniker.MekNr = MekNr;
        }

        public void HentUdlejning(int Onr)
        {
            udlejning = Data.Ordre_DB.HentUdlejning(Onr);
        }

        public bool OpdaterUdlejning()
        {
            if (udlejning != null)
                return Data.Ordre_DB.OpdaterUdlejning(udlejning);
            else
                return false;
        }

        public bool SletUdlejning()
        {

            return Data.Ordre_DB.SletUdlejning(udlejning);
        }

       
    }

    public class OrdreLinie
    {
        private int antal;
        private int olnr;
        private double solgtTilPris;
        private Vare vareIOrdreLinien;
        private bool udfort;
        private DateTime udfortDatoTid;

        public OrdreLinie(Vare VareIOrdreLinien,int Olnr, int Antal, double SolgtTilPris)
        {
            this.olnr = Olnr;
            this.antal = Antal;
            this.solgtTilPris = SolgtTilPris;
            this.vareIOrdreLinien = VareIOrdreLinien;
        }

        public OrdreLinie(Vare VareIOrdreLinien, int Olnr, int Antal, double SolgtTilPris, bool Udfort)
        {
            this.olnr = Olnr;
            this.antal = Antal;
            this.solgtTilPris = SolgtTilPris;
            this.vareIOrdreLinien = VareIOrdreLinien;
            this.udfort = Udfort;
            
        }

        public OrdreLinie(Vare VareIOrdreLinien, int Olnr, int Antal, double SolgtTilPris, bool Udfort, DateTime UdfortDatoTid)
        {
            this.olnr = Olnr;
            this.antal = Antal;
            this.solgtTilPris = SolgtTilPris;
            this.vareIOrdreLinien = VareIOrdreLinien;
            this.udfort = Udfort;
            this.udfortDatoTid = UdfortDatoTid;
        }

        public int Antal
        {
            get { return antal; }
        }

        public int Olnr
        {
            get { return olnr; }
        }

        public double SolgtTilPris
        {
            get { return solgtTilPris; }
        }
        public Vare VareIOrdreLinien
        {
            get { return vareIOrdreLinien; }
        }

        public bool Udfort
        {
            get { return udfort; }
            set { udfort = value; }
        }

        public DateTime UdfortDatoTid
        {
            get { return udfortDatoTid; }
            set { udfortDatoTid = value; }
        }
    }

}
